package com.smart.community.property.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.smart.community.commons.result.PageResult;
import com.smart.community.property.dto.RepairOrderDTO;
import com.smart.community.property.entity.RepairOrder;
import com.smart.community.property.vo.RepairOrderStatisticsVO;
import com.smart.community.property.vo.RepairOrderVO;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * 维修工单服务接口
 * @author Wu.Liang
 * @since 2025-06-26
 * @version 1.0.0
 */
public interface IRepairOrderService extends IService<RepairOrder> {
    
    // ========================= 维修工单管理 =========================
    
    /**
     * 分页查询维修工单
     * @param current 当前页
     * @param size 每页大小
     * @param communityId 社区ID
     * @param status 状态
     * @return 分页结果
     * @throws Exception 统一异常
     */
    PageResult<RepairOrderVO> pageRepairOrders(Integer current, Integer size, Long communityId, Integer status) throws Exception;
    
    /**
     * 获取维修工单详情
     * @param orderId 工单ID
     * @return 工单详情
     * @throws Exception 统一异常
     */
    RepairOrderVO getRepairOrderDetail(Long orderId) throws Exception;
    
    /**
     * 获取我的报修记录
     * @param current 当前页
     * @param size 每页大小
     * @param userId 用户ID
     * @param status 状态筛选
     * @return 分页结果
     * @throws Exception 统一异常
     */
    PageResult<RepairOrderVO> getMyRepairOrders(Integer current, Integer size, Long userId, Integer status) throws Exception;
    
    /**
     * 提交维修工单
     * @param repairOrderDTO 维修工单信息
     * @return 工单ID
     * @throws Exception 统一异常
     */
    Long submitRepairOrder(RepairOrderDTO repairOrderDTO) throws Exception;
    
    /**
     * 更新维修工单状态
     * @param orderId 工单ID
     * @param status 工单状态
     * @param remark 备注
     * @return 是否更新成功
     * @throws Exception 统一异常
     */
    boolean updateRepairOrderStatus(Long orderId, Integer status, String remark) throws Exception;
    
    /**
     * 分配维修工单
     * @param orderId 工单ID
     * @param repairmanId 维修人员ID
     * @param remark 分配备注
     * @return 是否分配成功
     * @throws Exception 统一异常
     */
    boolean assignRepairOrder(Long orderId, Long repairmanId, String remark) throws Exception;
    
    /**
     * 批量分配维修工单
     * @param orderIds 工单ID列表
     * @param repairmanId 维修人员ID
     * @return 分配结果统计
     * @throws Exception 统一异常
     */
    Map<String, Integer> batchAssignRepairOrders(List<Long> orderIds, Long repairmanId) throws Exception;
    
    /**
     * 完成维修工单
     * @param orderId 工单ID
     * @param result 维修结果
     * @param remark 完成备注
     * @return 是否完成成功
     * @throws Exception 统一异常
     */
    boolean completeRepairOrder(Long orderId, String result, String remark) throws Exception;
    
    /**
     * 取消维修工单
     * @param orderId 工单ID
     * @param reason 取消原因
     * @return 是否取消成功
     * @throws Exception 统一异常
     */
    boolean cancelRepairOrder(Long orderId, String reason) throws Exception;
    
    /**
     * 提交满意度评分
     * @param orderId 工单ID
     * @param satisfaction 满意度评分
     * @return 是否提交成功
     * @throws Exception 统一异常
     */
    boolean submitRating(Long orderId, Integer satisfaction) throws Exception;
    
    /**
     * 根据用户ID查询维修工单
     * @param userId 用户ID
     * @param communityId 社区ID
     * @param status 状态
     * @return 维修工单列表
     * @throws Exception 统一异常
     */
    List<RepairOrderVO> getRepairOrdersByUserId(Long userId, Long communityId, Integer status) throws Exception;
    
    /**
     * 根据维修人员ID查询维修工单
     * @param repairmanId 维修人员ID
     * @param communityId 社区ID
     * @param status 状态
     * @return 维修工单列表
     * @throws Exception 统一异常
     */
    List<RepairOrderVO> getRepairOrdersByRepairmanId(Long repairmanId, Long communityId, Integer status) throws Exception;
    
    /**
     * 查询紧急维修工单
     * @param communityId 社区ID
     * @return 紧急工单列表
     * @throws Exception 统一异常
     */
    List<RepairOrderVO> getUrgentRepairOrders(Long communityId) throws Exception;
    
    /**
     * 查询超时维修工单
     * @param communityId 社区ID
     * @param timeoutHours 超时小时数
     * @return 超时工单列表
     * @throws Exception 统一异常
     */
    List<RepairOrderVO> getTimeoutRepairOrders(Long communityId, Integer timeoutHours) throws Exception;
    
    /**
     * 获取维修工单统计信息
     * @param communityId 社区ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计信息
     * @throws Exception 统一异常
     */
    RepairOrderStatisticsVO getRepairOrderStatistics(Long communityId, LocalDate startDate, LocalDate endDate) throws Exception;
    
    /**
     * 生成工单号
     * @return 工单号
     * @throws Exception 统一异常
     */
    String generateOrderNo() throws Exception;

    /**
     * 更新工单最新进度记录的内容
     * @param orderId 工单ID
     * @param progressContent 新的进度内容
     * @return 是否更新成功
     * @throws Exception 统一异常
     */
    boolean updateLatestProgressContent(Long orderId, String progressContent) throws Exception;
} 